package com.czk.scala.chapter05

/**
 * @Author:ChenZhangKun
 * @Date: 2021/12/9 17:56
 */
object Test06_HighOrderFunction {
  def main(args: Array[String]): Unit = {
    def f(n: Int): Int = {
      println("调用")
      n + 1
    }

    println(f(123))

    // 1 函数作为值进行传递
    val f1: Int => Int = f
    // com.czk.scala.chapter05.Test06_HighOrderFunction$$$Lambda$5/1844169442@5ba23b66
    println(f1)
    println(f1(12))

    def fun(): Int = {
      println("fun")
      1
    }

    val f3 = fun _

    println(f3())

    // 2 函数作为参数传递
    def dualEval(op: (Int, Int) => Int, a: Int, b: Int): Int = {
      op(a, b)
    }
    // 调用函数
    println(dualEval((x, y) => x + y, 1, 3))

    // 3 函数作为返回值

    def f5(): (Int, Int) => Unit = {
      def f6(a: Int, b: Int): Unit = {
        println(a + b)
      }
      // 返回f6
      f6
    }
    // 得到返回值函数
    val function: (Int, Int) => Unit = f5()
    // 再次调用函数
    function(1, 6)
    // 简化调用
    f5()(1,4)
  }
}
